def a(x):
    def b():
        print(1111)
        x()
        print(2222)
    return b 
@a          #将f以参数形式传入a
def f():
    print(3333)
f()

#内置装饰器
class Base:
    def play():
        print('play')
    
    @property  #将方法变为属性，调用更为简洁
    def f1(self):
        return '将方法变为属性，调用更为简洁'

    @staticmethod  #把方法变为一个函数，可以增加一些功能
    def f2():
        return '切断方法和类之间的联系'

    @classmethod  #类方法，可以直接访问类属性和类方法
    def f3(cls):
        cls.play()
a=Base()
print(a.f1)
print(a.f2())
a.f3()

class A:
    def __init__(self,f):
        self.fun = f

    def __call__(self,*args,**kwargs):
        self.fun()
        return '直接调用'
@A
def f1():
    print('这是f1函数')
print(f1())
